#include <stdio.h>
#include <string.h>

// 定义一个指针数组 a 以及一个函数 fun()，该函数用于对指针数组存放的字符串进行排序。
// 调用函数，将指针数组 a 存放的字符串按照由大到小进行排序，输出排序前后的字符串

void printArr(char *a[], int len) {
    int i;
    for (i = 0; i < len; i++) {
        printf("%s ", a[i]);
    }
    printf("\n");
}

/**
 * 函数fun对一个字符串数组进行降序排序
 * @param a 字符串数组
 * @param m 数组中字符串的数量
 */
void fun(char *a[], int m) {
    printf("ori: ");
    printArr(a, m);

    // 用于交换字符串数组元素的临时变量
    char *t;
    // i, j, k用于循环控制
    int i, j, k;
    // 外层循环，遍历数组元素，跳过最后一个元素
    for (i = 0; i < m - 1; i++) {
        // 初始化k为当前外层循环的索引
        k = i;
        // 内层循环，比较当前元素与后续元素
        for (j = i + 1; j < m; j++) {
            // 如果当前元素小于后续元素，则更新k为后续元素的索引
            if (strcmp(a[k], a[j]) < 0) {
                k = j;
            }
            // 如果k不等于i，说明找到了更大的元素，进行交换
            if (k != i) {
                t = a[i];
                a[i] = a[k];
                a[k] = t;
            }
            printf("i=%d j=%d k=%d: ", i, j, k);
            printArr(a, m);
        }
    }
}


int main() {
    int i;
    char *a[] = {"1", "2", "3", "4", "5"};
    int len = sizeof(a) / sizeof(a[0]);
    fun(a, len);
    for (i = 0; i < len; i++) {
        printf("a[%d]=%s\n", i, a[i]);
    }
    return 0;
}